package com.javatest;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
 * @author LL
 * 一、核心的表达式
 * 因为需要动态显示小时的指针、分钟的指针、秒的指针的位置，所以确认三个指针的角度非常重要；
 * X：三个指针相交的原点的X坐标；
 * Y：三个指针相交的原点的Y坐标；
 * HOUR_LENGTH、MINUTE_LENGTH、SECOND_LENGTH表示时针、分针、秒针的长度；
 * hour、minute、second表示现在是几时、几分、几秒；
 *
 * hourLine.x2 = X+HOUR_LENGTH*Math.cos(hour*(Math.PI/6)-Math.PI/2);
 * hourLine.y2 = Y+HOUR_LENGTH*Math.sin(hour*(Math.PI/6)-Math.PI/2);
 * minLine.x2 = X+MINUTE_LENGTH*Math.cos(minute*(Math.PI/30)-Math.PI/2);
 * minLine.y2 = Y+MINUTE_LENGTH*Math.sin(minute*(Math.PI/30)-Math.PI/2);
 * secondLine.x2 = X+SECOND_LENGTH*Math.cos(second*(Math.PI/30)-Math.PI/2);
 * secondLine.y2 = Y+SECOND_LENGTH*Math.sin(second*(Math.PI/30)-Math.PI/2);
 *
 * 二、怎样动态显示
 * 简单的说就是每一秒更新一次屏幕，因此用Timer和TimerTask非常符合要求；每一秒刷新一次；
 *
 * @create 2020-12-22 16:07
 */
public class Subject21 extends JFrame {
    MyPanel clockPanel;
    Ellipse2D.Double e;
    int x; int y;
    Line2D.Double hourLine;
    Line2D.Double minLine;
    Line2D.Double secondLine;
    GregorianCalendar calendar;
    int hour;
    int minute;
    int second;

    public static final int X = 60;
    public static final int Y = 60;
    public static final int X_BEGIN = 10;
    public static final int Y_BEGIN = 10;
    public static final int RADIAN = 50;
    public Subject21() {
        setSize(300, 300);
        clockPanel = new MyPanel();
        add(clockPanel);
        Timer t = new Timer();
        Task task = new Task();
        t.schedule(task, 0, 1000);
    }

    public static void main(String[] args) {
        Subject21 t = new Subject21();
        t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        t.setVisible(true);
    }

    class MyPanel extends JPanel {
        public MyPanel() {
            e = new Ellipse2D.Double(X_BEGIN, Y_BEGIN, 100, 100);
            hourLine = new Line2D.Double(X, Y, X, Y);
            minLine = new Line2D.Double(X, Y, X, Y);
            secondLine = new Line2D.Double(X, Y, X, Y);
        }
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
//            for (int i = 0; i < 60; i++) {
//                g2.drawString("0".equals(String.valueOf(i))?"12":String.valueOf(i), 55, 25);
//            }
            g2.drawString("12", 55, 25);
            g2.drawString("3", 100, 65);
            g2.drawString("6", 55, 105);
            g2.drawString("9", 15, 65);
            g2.draw(e);
            g2.draw(hourLine);
            g2.draw(minLine);
            g2.draw(secondLine);
        }
    }
    class Task extends TimerTask {
        public void run() {
            calendar = new GregorianCalendar();
            hour = calendar.get(Calendar.HOUR);
            minute = calendar.get(Calendar.MINUTE);
            second = calendar.get(Calendar.SECOND);
            hourLine.x2 = X + 40    * Math.cos(hour   * (Math.PI / 6)  - Math.PI / 2);
            hourLine.y2 = Y + 40    * Math.sin(hour   * (Math.PI / 6)  - Math.PI / 2);
            minLine.x2 = X + 45     * Math.cos(minute * (Math.PI / 30) - Math.PI / 2);
            minLine.y2 = Y + 45     * Math.sin(minute * (Math.PI / 30) - Math.PI / 2);
            secondLine.x2 = X + 50  * Math.cos(second * (Math.PI / 30) - Math.PI / 2);
            secondLine.y2 = Y + 50  * Math.sin(second * (Math.PI / 30) - Math.PI / 2);
            repaint();
        }
    }


}

